#include <iostream>

using namespace std;

struct point{
	int x, y, z;
};

int n, zmin, zmax;
point[100] p;

double cal_cross_sec(double z0)
{
	int m = 0;
 	point[100] pc;

	// Find the list of intersections between plane z0 and line of (a, b) s.t. the intersection lies on (a, b)
	for (int i = 0; i < n; i++)
	{
		if (p[i].z > z0) break;
		for (int j = n-1; j > i; j--)
		{
			if (p[j].z < z0) break;
			
			double x0 = p[i].x + (z0 - p[i].z) * (p[j].x - p[i].x) / (p[j].z - p[i].z);
			double y0 = p[i].y + (z0 - p[i].z) * (p[j].y - p[i].y) / (p[j].z - p[i].z);
			
			pc[m].x = x0;
			pc[m].y = y0;
			pc[m].z = z0;						
			m++;
		}
	}
	
	// Graham scan here for points in pc	
		
	// return area of the convex hull of pc
	

	return area();
}

int main()
{
	cin >> n >> zmin >> zmax;
	for (int i = 0; i<n; i++) cin >> p[i].x >> p[i].y >> p[i].z;

	// sort by z
	for (int i = 0; i<n; i++) 
		for (int j = i+1; j<n; j++)
			if (p[i].z > p[j].z)
			{
				point temp = p[i];
				p[i] = p[j];
				p[j] = temp;
			}
	
	// for each z0 
	for (int z = zmin; z <= zmax; z++)
	{
		double answer = cal_cross_sec(z0);
		cout << answer << endl;
	}	
	

	return 0;
}

